﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpUiViewInterface.h"

namespace gcmp
{
    class IUiDocument;

    /// \brief 可定制的UiDocument关闭策略
    ///
    /// 允许开发者添加自己的关闭策略，在平台的内置策略之前执行。
    ///
    /// 平台的内置的策略是：
    ///     1.处于在位编辑模式时的关闭策略。
    ///     2.保存文件关闭策略。
    ///
    /// 和响应UiView事件进行处理的区别是:
    ///     策略决定了平台下一步的动作；而事件响应不需要也无法决定平台的下一步动作。
    /// 建议在Close()里执行定制的关闭相关行为，不要在事件响应里做具体关闭相关行为。
    ///
    /// 前置条件是：
    ///     关闭最后一个UiView，并且文档有修改。
    ///
    /// 时机是：
    ///     在UiViewEventType::UiViewTryClose之后，在UiViewEventType::PreUiViewClose之前。
    ///
    /// \see IUiDocumentViewManager
    class GCMP_UI_VIEW_INTERFACE_EXPORT IUiDocumentCloseStrategy
    {
    public:
        /// \brief 此策略是否可用。
        ///
        /// \param pUiDocument 正在关闭的UiDocument指针。
        /// \return bool 返回true表示可用；返回false表示不可用，将会跳到后续策略。
        virtual bool IsEnabled(const IUiDocument * pUiDocument) const = 0;

        /// \brief 执行定制的关闭行为。
        ///
        /// \param pUiDocument 正在关闭的UiDocument指针。
        /// \return bool 是否执行成功。
        virtual bool Close(IUiDocument * pUiDocument) const = 0;

        /// \brief 是否希望继续执行后续策略。
        ///
        /// \param pUiDocument 正在关闭的UiDocument指针。
        /// \return bool 返回true表示希望继续执行后续策略；返回false表示不希望执行后续策略。
        virtual bool ShouldContinueSubsequentStrategy() const = 0;

        /// \brief 是否希望关闭最后一个UIView时，关闭对应的Document以及对应的UiDocument
        ///
        /// 手动设置前默认为true
        /// \param closeDbDocument true为希望关闭，flase为不希望关闭
        /// \return bool 返回之前是否关闭最后一个UIView时关闭对应的Document
        static bool SetIfCloseDbDocumentAfterFinalUIViewClosed(bool closeDbDocument);

        /// \brief 关闭最后一个UIView时，是否关闭对应的Document以及对应的UiDocument
        /// \return bool true为关闭，flase为不关闭
        static bool GetIfCloseDbDocumentAfterFinalUIViewClosed();

        /// \brief 析构函数
        virtual ~IUiDocumentCloseStrategy();
    };
}   //namespace gcmp
